package com.dorm.cj.threadPool;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;

public class Main2 {

    public static void main(String[] args) {
        MyExecutor myExecutor = new MyExecutor(2, 4, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>());
        List<Future<String>> results = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            SleepTwoSecondsTask task = new SleepTwoSecondsTask();
            Future<String> result = myExecutor.submit(task);
            results.add(result);
        }
        myExecutor.shutdown();

        try {
            /*如果executor已经终止，立即返回true;否则会阻塞等待结果，当达到timeout时间会返回false*/
            while (!myExecutor.awaitTermination(2, TimeUnit.SECONDS)) {
                System.out.println("myExecutor is not shutdown=============");
            }
            System.out.println("myExecutor is shutdown===============");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("Main: End of the program.\n");
    }
}
/*
shutdown()：
停止接收外部submit的任务
内部正在跑的任务和队列里等待的任务，会执行完

shutdownNow()：
跟shutdown()一样，先停止接收外部提交的任务
忽略队列里等待的任务
尝试将正在跑的任务interrupt中断
返回未执行的任务列表
-------
它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的，但是大家知道，这种方法的作用有限，如果线程
中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以，ShutdownNow()并不代表
线程池就一定立即就能退出，它也可能必须要等待所有正在执行的任务都执行完成了才能退出。
---------------------

awaitTermination(long timeOut, TimeUnit unit)：
判断线程池是否已关闭，一般配合shutdown()使用


区别：
shutdown()后，不能再提交新的任务进去；但是awaitTermination()后，可以继续提交。
awaitTermination()是阻塞的，返回结果是线程池是否已停止（true/false）；shutdown()不阻塞。
*/